package com.waikuai.shop.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * MyBatis Plus元数据处理器
 * 处理创建时间和更新时间的自动填充
 * @author waikuai
 */
@Component
public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {

    private static final String CREATE_TIME = "createTime";
    private static final String UPDATE_TIME = "updateTime";

    @Override
    public void insertFill(MetaObject metaObject) {
        // 填充创建时间
        this.strictInsertFill(metaObject, CREATE_TIME, LocalDateTime.class, LocalDateTime.now());
        
        // 填充更新时间（仅当字段存在且不是 UserFavorite 表时）
        // 检查字段是否存在，如果不存在则跳过（避免 UserFavorite 表报错）
        if (metaObject.hasGetter(UPDATE_TIME)) {
            try {
                // 检查是否是 UserFavorite 实体（该表没有 update_time 字段）
                Object originalObject = metaObject.getOriginalObject();
                if (originalObject != null && !originalObject.getClass().getSimpleName().equals("UserFavorite")) {
                    this.strictInsertFill(metaObject, UPDATE_TIME, LocalDateTime.class, LocalDateTime.now());
                }
            } catch (Exception e) {
                // 如果获取原始对象失败，尝试填充（让 MyBatis Plus 根据字段注解判断）
                // 如果字段被标记为 exist = false，MyBatis Plus 会忽略
                this.fillStrategy(metaObject, UPDATE_TIME, LocalDateTime.now());
            }
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 填充更新时间（仅当字段存在且不是 UserFavorite 表时）
        if (metaObject.hasGetter(UPDATE_TIME)) {
            try {
                Object originalObject = metaObject.getOriginalObject();
                if (originalObject != null && !originalObject.getClass().getSimpleName().equals("UserFavorite")) {
                    this.strictUpdateFill(metaObject, UPDATE_TIME, LocalDateTime.class, LocalDateTime.now());
                }
            } catch (Exception e) {
                // 如果获取原始对象失败，尝试填充（让 MyBatis Plus 根据字段注解判断）
                this.fillStrategy(metaObject, UPDATE_TIME, LocalDateTime.now());
            }
        }
    }
}